import router from '@/router'
import { ElMessageBox, } from 'element-plus'
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { isHttp, isEmpty } from "@/utils/validate"
import defAva from '@/assets/images/profile.jpg'
import usePermissionStore from '@/store/modules/permission'

const useUserStore = defineStore(
    'user', {
        state: () => ({
            token: getToken(),
            id: '',
            name: '',
            nickName: '',
            avatar: '',
            roles: [],
            permissions: [],
            loginLoading: false
        }),
        actions: {
            // 设置登录loading状态
            setLoginLoading(loading) {
                this.loginLoading = loading
            },
            // 登录
            login(userInfo) {
                const username = userInfo.username.trim()
                const password = userInfo.password
                const code = userInfo.code
                const uuid = userInfo.uuid
                return new Promise((resolve, reject) => {
                    login(username, password, code, uuid).then(res => {
                        setToken(res.token)
                        this.token = res.token
                        resolve()
                    }).catch(error => {
                        reject(error)
                    })
                })
            },
            // 获取用户信息
            getInfo(showPasswordTips = true) {
                return new Promise((resolve, reject) => {
                    getInfo().then(res => {
                        const user = res.user
                        let avatar = user.avatar || ""
                        if (!isHttp(avatar)) {
                            avatar = (isEmpty(avatar)) ? defAva : import.meta.env.VITE_APP_BASE_API + avatar
                        }
                        if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
                            this.roles = res.roles
                            this.permissions = res.permissions
                        } else {
                            this.roles = ['ROLE_DEFAULT']
                        }
                        this.id = user.userId
                        this.name = user.userName
                        this.nickName = user.nickName
                        this.avatar = avatar

                        // 只有在需要显示密码提示时才显示
                        if (showPasswordTips) {
                            /* 初始密码提示 */
                            if (res.isDefaultModifyPwd) {
                                ElMessageBox.confirm('您的密码还是初始密码，请修改密码！', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
                                    router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
                                }).catch(() => {})
                            }
                            /* 过期密码提示 */
                            if (!res.isDefaultModifyPwd && res.isPasswordExpired) {
                                ElMessageBox.confirm('您的密码已过期，请尽快修改密码！', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
                                    router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
                                }).catch(() => {})
                            }
                        }
                        resolve(res)
                    }).catch(error => {
                        reject(error)
                    })
                })
            },
            // 退出系统
            logOut() {
                return new Promise((resolve, reject) => {
                    logout(this.token).then(() => {
                        this.token = ''
                        this.roles = []
                        this.permissions = []
                        removeToken()
                            // 清除权限路由
                        usePermissionStore().clearRoutes()
                        resolve()
                    }).catch(error => {
                        reject(error)
                    })
                })
            }
        }
    })

export default useUserStore